import { Injectable } from '@angular/core';
import { Observable, Subject } from 'rxjs';
import { ToastMessage, HideToastConfig } from '@shared/models/toast.models';

/**
 * Toast 服务
 * 
 * 功能：
 * - 全局单例服务，负责管理 Toast 通知的发送和隐藏
 * - 通过 Subject 实现发布订阅模式
 * 
 * 架构：
 * ```
 * Components → ToastService → ToastDirective → UI
 * ```
 * 
 * 使用场景：
 * - 成功/失败/警告/信息提示
 * - 操作反馈
 * - 错误提示
 */
@Injectable({
  providedIn: 'root'
})
export class ToastService {
  
  /** 通知消息主题 */
  private toastSubject: Subject<ToastMessage> = new Subject();

  /** 隐藏通知主题 */
  private hideToastSubject: Subject<HideToastConfig> = new Subject();

  constructor() {}

  /**
   * 发送 Toast 消息
   * 
   * @param toast - Toast 消息对象
   */
  dispatchNotification(toast: ToastMessage): void {
    this.toastSubject.next(toast);
  }

  /**
   * 隐藏 Toast
   * 
   * @param config - 隐藏 Toast 配置
   */
  hideToast(config: HideToastConfig): void {
    this.hideToastSubject.next(config);
  }

  /**
   * 获取 Toast 消息可观察对象
   * 
   * @returns Toast 消息的 Observable
   */
  getNotification(): Observable<ToastMessage> {
    return this.toastSubject.asObservable();
  }

  /**
   * 获取隐藏 Toast 的可观察对象
   * 
   * @returns 隐藏 Toast 的 Observable
   */
  getHideNotification(): Observable<HideToastConfig> {
    return this.hideToastSubject.asObservable();
  }
}

